perm filename MYPUB[MBS,LCS] blob sn#276923 filedate 1977-04-18 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	.<< BASED ON General PUB Macros in GENRAL.PUB[SUB,SYS]
C00003 00003	. DEVICE XGP
C00010 00004	.<< Digest number of sides per page and columns per side. >>
C00012 00005	.<< Set line spacing to new value. >>
C00013 00006	.<< Number sections. >>
C00019 00007	.<< Start text justification. >>
C00020 00008	.<< Put in a footnote. >>
C00021 00009	.<< Generate table of contents. >>
C00023 00010	.<< Set up for body of text. >>
C00024 ENDMK
C⊗;
.<< BASED ON General PUB Macros in GENRAL.PUB[SUB,SYS]
.	    Version 1.1, 4 March 1976
.		 Brian P. McCune
.   ALTERED BY GHB, 13 MAR. 1977
.Documentation for this set of general PUB macros is in GENRAL.BPM[UP,DOC]. >>
. DEVICE XGP;
. SIDES ← 1;
. INSERT CONTENTS;
.<< Set up fonts and text responses for device selected. >>
.
.START "XGP"
.
.<< Turn on quote character ("α") and font switching character ("%"). >>
.
.TURN ON "α%";
.
.<< Declare Baskerville fonts, FIX25 for special characters, and SUP for footnote
.numbers. >>
.
.FONT 1 "BASL30";
.FONT 2 "BASI30";
.FONT 3 "BASB30";
.FONT 4 "FIX25";
.FONT 5 "SUP";
.FONT 6 "ZERO30";
.
.<< Put in ligatures in all three Baskerville fonts. >>
.
.AT "ffl" ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "α∞" ELSE "αfαfαl"; ⊃;
.AT "ffi" ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "α≠"  ELSE "αfαfαi"; ⊃;
.AT "ff"  ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "α≥"  ELSE "αfαf"; ⊃;
.AT "fi"  ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "α≡" ELSE "αfαi"; ⊃;
.AT "fl"  ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "α∨"  ELSE "αfαl"; ⊃;
.
.<< Provide Stanford ASCII characters not available in Baskerville. >>
.
.AT "¬" ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "%4α¬%*" ELSE "α¬"; ⊃;
.AT "ε" ⊂ IF THISFONT = 1 THEN "%2αε%*" ELSE "αε"; ⊃;
.AT "∞" ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "%4α∞%*" ELSE "α∞"; ⊃;
.AT "∀" ⊂ IF THISFONT = 1 THEN "%2α∀%*" ELSE "α∀"; ⊃;
.AT "~" ⊂ IF THISFONT = 2 THEN "%1α~%*" ELSE "α~"; ⊃;
.AT "≠" ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "%4α≠%*" ELSE "α≠"; ⊃;
.AT "≥" ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "%4α≥%*" ELSE "α≥"; ⊃;
.AT "≡" ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "%4α≡%*" ELSE "α≡"; ⊃;
.AT "∨" ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "%4α∨%*" ELSE "α∨"; ⊃;
.
.<< Convert two successive Baskerville hyphens into em dash. >>
.
.AT "--"  ⊂ IF 1 ≤ THISFONT ≤ 3 THEN "α¬" ELSE "α--"; ⊃;
.
.<< Convert pair of double quotes into pair of open and close double quotes. >>
.
.QUOTE ← 0;
.AT """"
.	⊂
.	IF 1 ≤ THISFONT ≤ 3
.		THEN
.			START "CHANGE"
.			IF EVEN QUOTE THEN "α`α`" ELSE "α'α'";
.			QUOTE ← QUOTE + 1;
.			END "CHANGE"
.		ELSE "α""";
.	⊃;
.
.
.<< make up diacriticals >>
.
.AT ":a" ⊂ "%6α:%*a" ⊃;
.AT ":o" ⊂ "%6α:%*o" ⊃;
.AT ":u" ⊂ "%6α:%*u" ⊃;
.AT "'a" ⊂ "%6α'%*a" ⊃;
.AT "'e" ⊂ "%6α'%*e" ⊃;
.AT "'o" ⊂ "%6α'%*o" ⊃;
.AT "'u" ⊂ "%6α'%*u" ⊃;
.AT "`a" ⊂ "%6α`%*a" ⊃;
.AT "`e" ⊂ "%6α`%*e" ⊃;
.AT "`o" ⊂ "%6α`%*o" ⊃;
.AT "`u" ⊂ "%6α`%*u" ⊃;
.AT "∧a" ⊂ "%6α∧%*a" ⊃;
.AT "∧e" ⊂ "%6α∧%*e" ⊃;
.AT "∧i" ⊂ "%6α∧%*i" ⊃;
.AT "∧o" ⊂ "%6α∧%*o" ⊃;
.AT "∧u" ⊂ "%6α∧%*u" ⊃;
.AT ",c" ⊂ "%6α,%*c" ⊃;
.
.
.<< Print in //italics/ or ⊗⊗boldface⊗. >>
.
.AT "//" ENTRY "/"
.	⊂
.	LASTFONT1 ← THISFONT;
.	("%2ENTRY%" & LASTFONT1);
.	⊃;
.
.AT "⊗⊗" ENTRY "⊗"
.	⊂
.	LASTFONT2 ← THISFONT;
.	("%3ENTRY%" & LASTFONT2);
.	⊃;
.
.<< Print page headings on XGP (using boldface) before new page started. >>
.
.RECURSIVE MACRO STANDARD TITLES
.	⊂
.	IF !HF THEN
.		BEGIN "OUTPUT HEADING"
.		NOFILL;
.		TURN ON "←→{";
.		PREFACE 0;
.		INDENT 0,0,0;
.		IF EVEN PAGE
.			THEN
.				START "LOOK FOR EVEN PAGE HEADING"
.				IF LENGTH(!EH) THEN
.					START "OUTPUT EVEN PAGE HEADING"
.					PLACE HEADING;
.					SELECT 3;
.					!EH;
.					END "OUTPUT EVEN PAGE HEADING";
.				END "LOOK FOR EVEN PAGE HEADING"
.			ELSE
.				START "LOOK FOR ODD PAGE HEADING"
.				IF LENGTH(!OH) THEN
.					START "OUTPUT ODD PAGE HEADING"
.					PLACE HEADING;
.					SELECT 3;
.					!OH;
.					END "OUTPUT ODD PAGE HEADING";
.				END "LOOK FOR ODD PAGE HEADING";
.		END "OUTPUT HEADING";
.	⊃;
.
.END "XGP"
.
.<< Digest number of sides per page and columns per side. >>
.
.<< Make sure one or two sides chosen. >>
.
.IF SIDES ≠ 1 ∧ SIDES ≠ 2 THEN USERERR("SIDES argument not 1 or 2");
.
.<< Set up page frame and COLMNS macro for selected device. >>
.
.TITLE AREA HEADING LINES 1 TO 3;
.		START "XGP"
.		PAGE FRAME 54 HIGH 75 WIDE;
.		ODDLEFTBORDER ← EVENLEFTBORDER ← 1500;
.		MACRO COLMNS(NUMCOLS)
.			⊂
.			IF NUMCOLS = 1
.				THEN AREA TEXT LINES 4 TO 54
.				ELSE IF NUMCOLS = 2
.					THEN AREA TEXT LINES 4 TO 54 IN 2 COLUMNS 5 APART
.				ELSE USERERR("COLMNS argument not 1 or 2");
.			COLS ← NUMCOLS;
.			SSNAME ← NULL;
.			PLACE TEXT;
.			NEXT PAGE;
.			⊃;
.		END "XGP"
.<< Set line spacing to new value. >>
.
.MACRO SPACES(NUMSPACES)
.	⊂
.	IF NUMSPACES > 0
.		THEN
.			START "SET NEW INTER- AND INTRA-PARAGRAPH SPACING"
.			BREAK;
.			PREFACE NUMSPACES;
.			SPREAD ← NUMSPACES;
.			END "SET NEW INTER- AND INTRA-PARAGRAPH SPACING"
.		ELSE USERERR("SPACES argument not positive integer");
.	⊃;
.<< Number sections. >>
.
.<< Either go to new page or not upon new section or appendix. >>
.
.MACRO NEW_PAGE_ON_SECTION(NEW_PAGE_FLAG)
.	⊂
.	IF NEW_PAGE_FLAG = TRUE
.		THEN MACRO NEW SECTION
.			⊂
.			SKIP TO COLUMN 1;
.			IF SIDES = 2 ∧ EVEN PAGE THEN NEXT PAGE;
.			⊃
.		ELSE IF NEW_PAGE_FLAG = FALSE THEN MACRO NEW SECTION
.			⊂
.			IF LINES < (0 + 6*SPREAD) THEN SKIP TO LINE 1 ELSE SKIP 3;
.			⊃
.		ELSE USERERR("NEW_PAGE_ON_SECTION argument not TRUE or FALSE");
.	⊃;
.
.<< Generate section heading and table of contents entry. >>
.
.COUNT SECTION FROM 1 TO 99;
.MACRO S(NAME)
.	⊂
.	SECNAME ← SSNAME ← NULL;
.		BEGIN "PRINT SECTION HEADING"
.		NEW SECTION;
.		NEXT SECTION;
.		TURN ON "{";
.		INDENT 0,4,0;
.		NOJUST;
.		RETAIN;
⊗⊗{SECTION!}.  NAME⊗
.		SKIP 1;
.		SECNAME ← "NAME";
.		SEND CONTENTS
.			⊂
.			INDENT 0,4,4;
.			SKIP 1;
.			GUARANTEE LINES 6;
{SECTION!}.  NAME
.<< {SECTION!}.  NAME→  {PAGE!} >>
.			⊃;
.		END "PRINT SECTION HEADING";
.	⊃;
.
.<< Generate subsection heading and table of contents entry. >>
.
.COUNT SUBSECTION FROM 1 TO 99 IN SECTION PRINTING "!.1";
.MACRO SS(NAME)
.	⊂
.	SSNAME ← NULL;
.		BEGIN "PRINT SUBSECTION HEADING"
.		IF LINES < (5 + 5*SPREAD) THEN SKIP TO LINE 1 ELSE SKIP 2;
.		NEXT SUBSECTION;
.		TURN ON "{";
.		INDENT 3,8,0;
.		NOJUST;
.		RETAIN;
⊗⊗{SUBSECTION!}  NAME⊗
.		SSNAME ← "NAME";
.		SEND CONTENTS
.			⊂
.			INDENT 4,9,4;
.			GUARANTEE LINES 4;
{SUBSECTION!}  NAME
.<< {SUBSECTION!}  NAME→  {PAGE!} >>
.			⊃;
.		END "PRINT SUBSECTION HEADING";
.	⊃;
.
.<< Generate subsubsection heading and table of contents entry. >>
.
.COUNT SUB2 FROM 1 TO 99 IN SUBSECTION PRINTING "!.1";
.MACRO SSS(NAME)
.	⊂
.		BEGIN "PRINT SUBSUBSECTION HEADING"
.		IF LINES < (4 + 4*SPREAD) THEN SKIP TO LINE 1 ELSE SKIP 1;
.		NEXT SUB2;
.		TURN ON "{";
.		INDENT 6,13,0;
.		NOJUST;
.		RETAIN;
⊗⊗{SUB2!}  NAME⊗
.		SEND CONTENTS
.			⊂
.			INDENT 9,16,4;
.			GUARANTEE LINES 2;
{SUB2!}  NAME
.<< {SUB2!}  NAME→  {PAGE!} >>
.			⊃;
.		END "PRINT SUBSUBSECTION HEADING";
.	⊃;
.
.COUNT SUB3 FROM 1 TO 99 IN SUB2 PRINTING "!.1";
.MACRO SSSS(NAME)
.	⊂
.		BEGIN "PRINT SUBSUBSUBSECTION HEADING"
.		IF LINES < (4 + 4*SPREAD) THEN SKIP TO LINE 1 ELSE SKIP 1;
.		NEXT SUB3;
.		TURN ON "{";
.		INDENT 9,17,0;
.		NOJUST;
.		RETAIN;
⊗⊗{SUB3!}  NAME⊗
.		SEND CONTENTS
.			⊂
.			INDENT 14,23,4;
.			GUARANTEE LINES 2;
{SUB3!}  NAME
.<< {SUB2!}  NAME→  {PAGE!} >>
.			⊃;
.		END "PRINT SUBSUBSUBSECTION HEADING";
.	⊃;
.
.<< Generate appendix heading and table of contents entry. >>
.
.COUNT APPENDIX FROM 1 TO 99 PRINTING "A";
.MACRO APP(NAME)
.	⊂
.	SECNAME ← SSNAME ← NULL;
.		BEGIN "PRINT APPENDIX HEADING"
.		NEW SECTION;
.		NEXT APPENDIX;
.		TURN ON "{";
.		INDENT 0,4,0;
.		NOJUST;
.		RETAIN;
⊗⊗Appendix {APPENDIX!}.  NAME⊗
.		SKIP 1;
.		SECNAME ← "Appendix " & APPENDIX!;
.		SSNAME ← "NAME";
.		IF APPENDIX = 1 THEN
.			BEGIN "FIRST TIME"
.			SECTYPE ← "Appendix";
.			SEND CONTENTS
.				⊂
.				IF LINES < (6 + 4*SPREAD)
.					THEN SKIP TO LINE 1
.					ELSE SKIP 2;
.				INDENT 12,18,0;
⊗⊗Appendix→Page⊗
.				⊃;
.			IF SIDES = 1 THEN EVERY HEADING({SECNAME},{SSNAME},{PAGE!});
.			END "FIRST TIME";
.		SEND CONTENTS
.			⊂
.			SKIP 1;
.			INDENT 0,4,4;
.			GUARANTEE LINES 2;
{APPENDIX!}.  NAME→  {PAGE!}
.			⊃;
.		END "PRINT APPENDIX HEADING";
.	⊃;
.
.<< Generate centered subtitle heading without table of contents entry. >>
.
.MACRO CB(TITLE)
.	⊂
.		BEGIN "PRINT CENTERED HEADING"
.		TURN ON "←";
.		IF LINES < (3 + 3*SPREAD) THEN SKIP TO LINE 1;
⊗⊗←TITLE⊗
.		END "PRINT CENTERED HEADING";
.	⊃;
.<< Start text justification. >>
.
.MACRO JUSTIFY
.	⊂
.	FILL;
.	ADJUST;
.	RETAIN;
.	⊃;
.<< Put in a footnote. >>
.
.COUNT FOOTNOTE INLINE FROM 1 TO 999 IN SECTION PRINTING
.	(IF THISDEVICE = "XGP" THEN "%51%*" ELSE "[1]");
.FOOTSEP ← "__________";
.AT "∪∪" ENTRY "∪"
.	⊂
.	NEXT FOOTNOTE;
.	FOOTNOTE!;
.	SEND FOOT
.		⊂
.		BEGIN "NEXT FOOTNOTE"
.		SELECT 1;
.		JUSTIFY;
.		SPACES 1;
.		INDENT 0,0,0;
.		(FOOTNOTE! & " ");
ENTRY
.		END "NEXT FOOTNOTE";
.		⊃;
.	⊃;
.<< Generate table of contents. >>
.
.MACRO COLLECT CONTENTS
.	⊂
.	COUNT PAGE FROM 1 TO 99 PRINTING "i";
.<<	IF SIDES = 2
.		THEN
.			START "TWO SIDED HEADING"
.			ODD HEADING(,Table of Contents,{PAGE!});
.			EVEN HEADING({PAGE!},Table of Contents,);
.			END "TWO SIDED HEADING"
.		ELSE EVERY HEADING(,Table of Contents,{PAGE!}); >>
.	PORTION CONTENTS;
.	PLACE HEADING;
.	PLACE TEXT;
.	FILL;
.	NOJUST;
.	RETAIN;
.	CRBREAK;
.	PREFACE SPREAD - 1;
.	TURN ON "{→";
.	SECTYPE ← "Section";
.	MACRO GUARANTEE LINES(MINIMUM_LINES)
.		⊂
.		IF LINES < (MINIMUM_LINES*SPREAD + SPREAD - 1) THEN
.			BEGIN "NEW COLUMN"
.			SKIP TO LINE 1;
.			INDENT 12,18,0;
⊗⊗{SECTYPE}→Page⊗
.			END "NEW COLUMN";
.		⊃;
.	INDENT 12,18,0;
.<< ⊗⊗Section→Page⊗ >>
.	RECEIVE;
.	⊃;
.<< Set up for body of text. >>
.
.PORTION MAIN
.
.IF SIDES = 2
.	THEN
.		START "TWO SIDED HEADING"
.		EVEN HEADING({PAGE!},,{SECNAME});
.		ODD HEADING({SSNAME},,{PAGE!});
.		END "TWO SIDED HEADING"
.	ELSE EVERY HEADING(,{PAGE!},);
.SECNAME ← SSNAME ← NULL;
.PLACE HEADING;
.
.PLACE TEXT;
.SELECT 1;
.JUSTIFY;
. COLMNS 1;
. SPACES 2;
. NEW_PAGE_ON_SECTION FALSE;
. INDENT 5;